package com.gzdict.common.utils

import com.drake.net.Net
import com.drake.net.NetConfig
import com.drake.net.component.Progress
import com.drake.net.interfaces.ProgressListener
import com.drake.net.request.BodyRequest
import com.drake.net.request.UrlRequest
import okhttp3.RequestBody.Companion.toRequestBody

/**
 * 描述: http 请求
 * 目前使用三方框架   implementation  "com.github.liangjingkanji:Net:3.2.0"
 * 可以切换
 * @author: create by shang
 * date:2024/3/6 0006 17
 */
object HttpUtil {


    /**
     * 同步网络请求
     * @param path 请求路径, 如果其不包含http/https则会自动拼接[NetConfig.host]
     * @param tag 可以传递对象给Request请求, 一般用于在拦截器/转换器中进行针对某个接口行为判断
     * @param queryMap queryMap 请求参数
     */
    inline fun <reified R> httpGet(
        path: String,
        queryMap: Map<String, String>? = null,
        id: Any? = null,
        tag: Any? = null
    ): R {
        return Net.get(path, tag) {
            queryMap?.forEach{
                param(it.key, it.value)
            }
            setId(id)
        }.execute<R>()
    }

    /**
     * 同步网络请求
     *
     * @param path 请求路径, 如果其不包含http/https则会自动拼接[NetConfig.host]
     * @param tag 可以传递对象给Request请求, 一般用于在拦截器/转换器中进行针对某个接口行为判断
     * @param block 函数中可以配置请求参数
     */
    inline fun <reified R> httpPost(
        path: String,
        paramJson: String? = null,
        id: Any? = null,
        tag: Any? = null,
    ): R {
        return Net.post(path, tag) {
            setId(id)
            body = paramJson?.toRequestBody()
        }.execute<R>()
    }


    /**
     * 同步网络请求
     *
     * @param path 请求路径, 如果其不包含http/https则会自动拼接[NetConfig.host]
     * @param tag 可以传递对象给Request请求, 一般用于在拦截器/转换器中进行针对某个接口行为判断
     * @param block 函数中可以配置请求参数
     */
    inline fun <reified R> httpDelete(
        path: String,
        paramJson: String? = null,
        id: Any? = null,
        tag: Any? = null
    ): R {
        return Net.delete(path, tag) {
            setId(id)
            body = paramJson?.toRequestBody()
        }.execute<R>()
    }

    /**
     * 同步网络请求
     *
     * @param path 请求路径, 如果其不包含http/https则会自动拼接[NetConfig.host]
     * @param tag 可以传递对象给Request请求, 一般用于在拦截器/转换器中进行针对某个接口行为判断
     * @param block 函数中可以配置请求参数
     */
    inline fun <reified R> httpPut(
        path: String,
        paramJson: String? = null,
        id: Any? = null,
        tag: Any? = null
    ): R {
        return Net.put(path, tag) {
            setId(id)
            body = paramJson?.toRequestBody()
        }.execute<R>()
    }

    /**
     * 取消指定的网络请求, Id理论上是唯一的, 所以该函数一次只能取消一个请求
     * @return 如果成功取消返回true
     * @see com.drake.net.request.BaseRequest.setId
     */
    fun httpCancelId(id: Any?): Boolean = Net.cancelId(id)

    /**
     * 监听正在请求的上传进度
     * @param id 请求的Id
     * @see com.drake.net.request.BaseRequest.setId
     */
    fun httpAddUploadListener(id: Any, block:(totalSize: String, currentSize: String)->Unit) =
        Net.addUploadListener(id,object :ProgressListener(){
            override fun onProgress(p: Progress) {
                block.invoke(p.totalSize(),p.currentSize())
            }
        })

    /**
     * 监听正在请求的下载进度
     * @param id 请求的Id
     * @see com.drake.net.request.BaseRequest.setId
     */
    fun addDownloadListener(id: Any,block:(totalSize: String, currentSize: String)->Unit) =
        Net.addDownloadListener(id,object :ProgressListener(){
            override fun onProgress(p: Progress) {
                block.invoke(p.totalSize(),p.currentSize())
            }
        })

}

